home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
pc
/
files
/
t_unix
/
bs941029.tgz
/
bbsx-941029.tar
/
bbsx
/
killdup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-29
|
7KB
|
242 lines
#ifndef __lint
static char rcsid[] = "@(#) $Header: /home/dg1rtf/tcp/bbsx/RCS/killdup.c,v 1.1 1994/06/01 22:21:32 dg1rtf Exp $";
#endif
#define _HPUX_SOURCE
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
#include <pwd.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "bbs.h"
#include "bbs.hd"
#define SAVETIME (7*24*60*60)
struct vitals {
unsigned short len;
unsigned short sum;
unsigned short crc;
};
static FILE *fpbbs;
static const char *datafile = "killdup_data";
static const char *tempfile = "killdup_temp";
static int delmesg;
static int firstmesg;
static int lastmesg;
static int savemesg;
static struct vitals *vitals;
const struct cmdtable cmdtable[1];
/* In killdup.c: */
static int getvitals(int n);
static void delete_mesg(int n);
int main(void);
/*---------------------------------------------------------------------------*/
static const unsigned short crc_table[] = {
0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
};
/*---------------------------------------------------------------------------*/
static int getvitals(int n)
{
FILE * fp;
char *p;
char *q;
char buf[1024];
char filename[1024];
int c;
struct vitals *v;
v = vitals + n;
v->len = v->sum = v->crc = 0;
strcpy(filename,getfilename(n));
if (!(fp = fopen(filename, "r"))) return 0;
while (fgets(buf, sizeof(buf), fp)) {
p = q = buf;
while ((c = (*p++ & 0x7f)) != 0)
if (c > ' ' && c < 0x7f) *q++ = c;
*q = '\0';
if (!*buf) continue;
if (buf[0] == 'R' && buf[1] == ':') continue;
for (p = buf; *p; p++) {
v->len++;
v->sum += (*p & 0xff);
v->crc = (v->crc >> 8) ^ crc_table[(v->crc ^ *p) & 0xff];
}
}
fclose(fp);
return 1;
}
/*---------------------------------------------------------------------------*/
static void delete_mesg(int n)
{
if (n > delmesg) {
if (savemesg >= n) savemesg = n - 1;
return;
}
if (!fpbbs) {
fpbbs = popen("exec bbs", "w");
if (!fpbbs) halt();
}
fprintf(fpbbs, "delete %d\n", n);
fflush(fpbbs);
vitals[n].len = vitals[n].sum = vitals[n].crc = 0;
}
/*---------------------------------------------------------------------------*/
int main(void)
{
FILE * fp1;
FILE * fp;
char buf[1024];
char filename[1024];
char host[1024];
int fd;
int fdindex;
int i;
int j;
int vsize;
long timelimit;
struct index index;
struct passwd *pw;
struct vitals *vi;
struct vitals *vj;
if (getuid()) {
pw = getpwnam(bbsadm);
if(getuid() != pw->pw_uid) {
perror("permission denied");
return 1;
}
}
if (chdir(WRKDIR)) {
mkdir(WRKDIR, 0755);
if(chdir(WRKDIR)) halt();
}
read_config();
if ((fdindex = open(INDEXFILE, O_RDONLY, 0644)) < 0) halt();
if (lseek(fdindex, -sizeof(index), SEEK_END) < 0) halt();
if (read(fdindex, (char *) &index, sizeof(index)) != sizeof(index))
halt();
lastmesg = savemesg = delmesg = index.mesg;
vsize = (lastmesg + 1) * sizeof(*vitals);
if (!(vitals = malloc(vsize))) halt();
firstmesg = 1;
if ((fd = open(datafile, O_RDONLY, 0644)) >= 0) {
firstmesg = read(fd, (char *) vitals, vsize) / sizeof(*vitals);
if (firstmesg < 1) firstmesg = 1;
close(fd);
}
if (firstmesg > lastmesg) return 0;
if (!(fp = fopen(CONFIGFILE, "r"))) halt();
while (fgets(buf, sizeof(buf), fp))
strlwc(buf);
if (sscanf(buf, "mbox:%s", host) == 1 && (pw = getpwnam(host)) != NULL) {
sprintf(filename, "%s/" SEQFILE, pw->pw_dir);
if (!(fp1 = fopen(filename, "r"))) halt();
if (fscanf(fp1, "%d", &i) == 1 && i < delmesg) delmesg = i;
fclose(fp1);
}
endpwent();
fclose(fp);
timelimit = time(NULL) - SAVETIME;
if (lseek(fdindex, -sizeof(index), SEEK_END) < 0) halt();
for (; ; ) {
if (read(fdindex, (char *) &index, sizeof(index)) != sizeof(index))
halt();
if (index.mesg < delmesg) break;
if (index.date < timelimit) {
delmesg = index.mesg;
break;
}
if (lseek(fdindex, -2 * sizeof(index), SEEK_CUR) < 0) break;
}
for (i = firstmesg; i <= lastmesg; i++)
if (getvitals(i)) {
vi = vitals + i;
if (!vi->len && !vi->sum && !vi->crc)
delete_mesg(i);
else
for (j = 1; j < i; j++) {
vj = vitals + j;
if (vi->len == vj->len && vi->sum == vj->sum && vi->crc == vj->crc)
delete_mesg(j);
}
}
if (savemesg >= firstmesg) {
vsize = (savemesg + 1) * sizeof(*vitals);
if ((fd = open(tempfile, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0)
halt();
if (write(fd, (char *) vitals, vsize) != vsize) halt();
close(fd);
if (rename(tempfile, datafile)) halt();
}
if (fpbbs) {
fprintf(fpbbs, "quit\n");
fflush(fpbbs);
pclose(fpbbs);
}
return 0;
}